home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 9 / Night Owl CD-ROM (NOPV9) (Night Owl Publisher) (1993).ISO / 042a / bpl70n11.zip / INSTR.PAS < prev    next >
Pascal/Delphi Source File  |  1993-03-07  |  3KB  |  50 lines

  1. { Instr is similar to Pos, but allows to specify a start position at which the
  2.   search in the Target string for the Objct string is to start.
  3.  
  4.   Copyright (c) 1989-1993 Norbert Juffa
  5. }
  6.  
  7.  
  8.  
  9. FUNCTION  Instr  (Objct, Target: STRING; StartPos: BYTE): BYTE; ASSEMBLER;
  10. ASM
  11.            CLD                   { auto increment for string instructions }
  12.            PUSH    DS            { save Turbo Pascal's data segment }
  13.            LES     DI, [Target]  { pointer to target string }
  14.            LDS     SI, [Objct]   { pointer to object string }
  15.            XOR     BX, BX        { initialize }
  16.            OR      BL, [StartPos]{  start position }
  17.            JZ      @NoChange     { don't change when zero }
  18.            DEC     BX            { dekrement start position }
  19. @NoChange: LODSW                 { AL = length Object, AH = 1. char in Object }
  20.            SUB     AL, 1         { length Object - 1 }
  21.            JB      @NotFound1    { exit, if length-1 < 0 }
  22.            MOV     CL, ES: [DI]  { length target String }
  23.            MOV     CH, CL        { length traget String }
  24.            SUB     CL, AL        { length target - length Object + 1 }
  25.            JBE     @NotFound1    { if <= 0, exit }
  26.            SUB     CL, BL        { remaining length Target }
  27.            JBE     @NotFound1    { if <= 0, exit }
  28.            INC     DI            { 1. char in Target }
  29.            ADD     DI, BX        { start position in Target }
  30.            XCHG    CH, BH        { BH = length target string, CH = 0 }
  31.            XCHG    AL, AH        { AL = 1. char Object, AH = length Object }
  32.            MOV     BP, SI        { save pointer }
  33. @Search1:  REPNZ   SCASB         { scan target for 1st char of Object }
  34.            JNZ     @NotFound2    { if not found, exit }
  35.            MOV     BL, CL        { save remaining length target }
  36.            MOV     CL, AH        { char still to compare in Object }
  37.            MOV     DX, DI        { get offset into Target }
  38.            REPZ    CMPSB         { compare CX chars of Target and Object }
  39.            MOV     SI, BP        { offset into Object }
  40.            MOV     DI, DX        { offset into Target }
  41.            MOV     CL, BL        { remaining length Target }
  42.            JNZ     @Search1      { continue search if no complete match }
  43.            SUB     BH, BL        { pos = length Target - remaining len target}
  44.            SUB     BH, AH        { pos = l. Target - rem. l. target - l. Object}
  45. @NotFound1:MOV     CH, BH        { pos }
  46. @NotFound2:MOV     AL, CH        { pos }
  47.            XOR     AH, AH        { clear MSB }
  48.            POP     DS            { restore TURBO Pascal's data segment }
  49. END; { Instr }
  50.